import { toast as A } from 'vue3-toastify'

/**
 * 显示一个toast提示消息
 * @param {string} [title='操作成功'] - 提示消息的文本内容
 * @param {'success'|'error'|'info'|'warning'|'default'} [type='success'] - toast的类型，决定显示的图标和样式
 * @param {'top-right'|'top-left'|'top-center'|'bottom-right'|'bottom-left'|'bottom-center'} [position='top-right'] - toast显示在屏幕的位置
 * @param {'light'|'dark'|'colored'} [theme='light'] - toast的主题样式
 * @param {'bounce'|'flip'|'slide'|'zoom'} [transition='bounce'] - toast出现和消失的动画效果
 * @param {boolean} [dangerouslyHTMLString=true] - 是否允许将title作为HTML字符串渲染
 * @returns {void}
 * @example
 *  显示一个成功提示
 * toast('操作成功')
 *
 *  显示一个错误提示在底部中间
 * toast('操作失败', 'error', 'bottom-center')
 */
export const toast = (
  title = '操作成功',
  type = 'success',
  position = 'top-right',
  theme = 'light',
  transition = 'bounce',
  dangerouslyHTMLString = true,
) => {
  A(title, {
    theme,
    type,
    position,
    transition,
    dangerouslyHTMLString,
  })
}

/**
 * 验证是否是邮箱地址
 * @param email - 邮箱地址
 * @returns boolean
 */
export function isValidEmail(email) {
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
  return emailRegex.test(email)
}

/**
 * 验证是否是手机号码
 * @param phone - 手机号码
 * @returns boolean
 */
export const isValidPhone = (phone) => phoneRegex.test(/^1[3-9][0-9]{9}$/)

/**
 * 生成uuid
 * @returns 返回uuid字符串
 */
export function uuid() {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
    var r = (Math.random() * 16) | 0,
      v = c == 'x' ? r : (r & 0x3) | 0x8
    return v.toString(16)
  })
}

/**
 * 后端返回字符串转换成列表
 * @param str - 后端的字符串
 * @returns 返回以[,;，；]分割的列表
 */
export function strToArray(str) {
  return str
    .split(/[,;，；]+/)
    .map((item) => item.trim())
    .filter((item) => item !== '')
}

/**
 * 统一给图片加上前缀
 * @param url - 图片地址，可以是有前缀和没前缀的
 * @param prefix - 图片前缀，默认是当前服务器地址
 * @returns 完整图片地址
 */
export function imgAddPrefix(url, prefix = IMAGE_URL) {
  return url.startsWith('http') ? url : prefix + url
}

/**
 * 给数字类型增加单位，例如1600转换成1.6k
 * @param num - 想要转换的数字
 * @returns 增加单位后的数字，如1.6k
 */
export function addUnits(num) {
  const unit = typeof num === 'string' ? parseInt(num, 10) : num

  if (unit >= 100000) {
    // 大于等于 100000 使用 'w' 单位
    return (unit / 10000).toFixed(1) + 'w'
  } else if (unit >= 10000) {
    // 大于等于 10000 使用 'w' 单位
    return (unit / 10000).toFixed(1) + 'w'
  } else if (unit >= 1000) {
    // 大于等于 1000 使用 'k' 单位
    return (unit / 1000).toFixed(1) + 'k'
  } else {
    // 小于 1000 不使用单位
    return unit.toString()
  }
}

/**
 * 格式化手机号或邮箱
 * @param contact - 手机号或邮箱
 * @returns 格式化后的字符串
 */
export function formatContact(contact) {
  if (isValidPhone(contact)) {
    return contact.replace(/^(\d{3})\d{4}(\d{4})$/, '$1****$2')
  } else if (isValidEmail(contact)) {
    const [localPart, domain] = contact.split('@')
    if (localPart.length > 3) {
      return `${localPart.slice(0, 3)}****@${domain}`
    } else {
      return `${localPart}****@${domain}`
    }
  } else return contact
}

/**
 * 生成随机颜色
 * @returns 随机颜色的字符串表示，例如 #RRGGBB
 */
export function getRandomColor() {
  const letters = '0123456789ABCDEF'
  let color = '#'
  for (let i = 0; i < 6; i++) {
    color += letters[Math.floor(Math.random() * 16)]
  }
  return color
}
